﻿// ===============================================================================
//  Copyright © ymind.net. All rights reserved .
//  官方网站：http://ymind.net/
//  版权所有：彦铭工作室 老陈出品
// ===============================================================================

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;

namespace Lcsoft.Data.RDBMS.Results
{
	/// <summary>
	/// 表示多个数据库查询结果，并封装它的一般操作。
	/// </summary>
	[ComVisible(true)]
	public sealed class MultiResult
	{
		private readonly ArrayList _resultList = new ArrayList();

		/// <summary>
		/// 获取当前 <see cref="MultiResult"/> 的实例中所容纳的查询结果对象的数量。
		/// </summary>
		public int Count
		{
			get { return this._resultList.Count; }
		}

		/// <summary>
		/// 提取指定索引处的指定类型的对象。
		/// </summary>
		/// <typeparam name="T">指定要提取的对象的类型。</typeparam>
		/// <param name="index">要获得的对象的从零开始的索引。</param>
		/// <returns>返回指定类型的对象的实例。</returns>
		public T Fetch<T>(int index)
		{
			try
			{
				if (this._resultList[index] == null) return default(T);

				return (T)this._resultList[index];
			}
			catch (IndexOutOfRangeException e)
			{
				throw new SimpleSqlException(String.Format("在索引 {0} 的位置上没有找到可用数据。", index), e);
			}
			catch (InvalidCastException ex)
			{
				throw new SimpleSqlException(String.Format("要提取的元素的类型（{0}）与指定的返回类型不匹配。", typeof(T)), ex);
			}
		}

		/// <summary>
		/// 将查询结果提取到指定类型的泛型集合中的指定索引处。
		/// </summary>
		/// <typeparam name="T">指定集合中对象的类型。</typeparam>
		/// <param name="index">要在此处插入新对象的从零开始的索引。</param>
		/// <returns>返回指定类型的对象的集合。</returns>
		public List<T> FetchAll<T>(int index)
		{
			var resultset = new List<T>();

			try
			{
				var results = this._resultList[index];

				if (results == null) return default(List<T>);

				if (results is ArrayList) resultset.InsertRange(0, (results as ArrayList).Cast<T>());
				else resultset.Add((T)results);
			}
			catch (IndexOutOfRangeException e)
			{
				throw new SimpleSqlException(String.Format("在索引 {0} 的位置上没有找到可用数据。", index), e);
			}
			catch (InvalidCastException ex)
			{
				throw new SimpleSqlException(String.Format("要提取的元素的类型（{0}）与指定的返回类型不匹配。", typeof(T)), ex);
			}

			return resultset;
		}

		/// <summary>
		/// 添加新的查询结果。
		/// </summary>
		/// <param name="result">包含要添加的新的查询结果的 <see cref="System.Object"/>。</param>
		internal void AddResult(object result) { this._resultList.Add(result); }
	}
}
